﻿//* ==========================================================================
// Classe : Cryptage 
// Fonctions : Classe  de fonctions de hashage et cryptage 
// 
// License:  License LGPL 
// Version :  0.01    du 13/07/2008 
// Lien : http://outils.codeplex.com 
// Auteur(s) : JF. PACORY
// CopyLeft: CopyLeft (>) 2008-2009 GlopSoft <contact@glopsoft.com>
// Création : 06/26/2009 23:12:15
// Etat : en cours
// Controle du :
// Licence : 
// L'autorisation est accordée, à titre gratuit, à toute personne d'obtenir une copie 
// de ce logiciel et de ses fichiers de documentation, pour pouvoir utiliser 
//ce logiciel sans restriction, y compris, sans s'y limiter, les droits 
// d'utiliser, de copier, de modifier, de fusionner, de publier, de distribuer, 
// de sous-licence, et / ou de vendre les copies du Logiciel, et d'autoriser les 
// personnes auxquelles le logiciel est livré de le faire, sous réserve des 
// conditions suivantes:
// 
// Les avis de droit d'auteur et la présente autorisation doivent être inclus dans 
// toutes les copies ou parties substantielles du Logiciel.
// 
// LE LOGICIEL EST FOURNI "TEL QUEL", SANS GARANTIE DE QUELQUE NATURE QUE CE SOIT, 
// EXPLICITE OU  IMPLICITE, Y COMPRIS, MAIS SANS Y LIMITER LES GARANTIES DE QUALITE 
// MARCHANDE, D'ADEQUATION A UN USAGE PARTICULIER ET D'ABSENCE DE CONTREFAÇON. EN 
// AUCUN CAS LES AUTEURS OU LES TITULAIRES DE DROITS D'AUTEUR POURRONT ETRE TENUE 
// RESPONSABLES DE TOUT DOMMAGE,  RÉCLAMATION OU AUTRE  RESPONSABILITE, DANS LE 
// CADRE D'UNE ACTION DE CONTRAT, UN DELIT OU AUTRE, DÉCOULANT DE, OU EN RELATION 
// AVEC LE LOGICIEL OU DE SON UTILISATION OU AUTRES EN RELATION AVEC LE LOGICIEL.
// Licence LGPL : http://commonlibrarynet.codeplex.com/license 
//*---------------------------------------------------------------------------
//
//* ==========================================================================

#region Références

using System;
using System.Text;
using System.Security.Cryptography;

#endregion

namespace Outils.Cryptage
{
    /// <summary>
    /// Classe  de fonctions de hashage et cryptage 
    /// </summary>
    public class Cryptage
    {
        #region Attributs

        private static System.IFormatProvider formatCulture = new System.Globalization.CultureInfo("fr-FR", true);

        #endregion

        #region Donne la somme MD5 d'une chaine

        /// <summary>
        /// Donne la somme MD5 d'une chaine
        /// </summary>        
        /// <param name="sChaine">Chaine à traiter (string)</param>
        /// <param name="bMetEnMinuscules">Met la chaine de sortie en minuscules si vrai, sinon en majuscules (défaut)</param>
        /// <returns>somme MD5 de la chaine (string)</returns>
        /// <example> 
        /// texteCrypte = Cryptage.RetourneMD5( texteSaisi );
        ///</example>    
        ///<exception cref="ArgumentNullException"></exception>
        ///<exception cref="ObjectDisposedException"></exception>
        public static string RetourneMD5(string sChaine) { return RetourneMD5(sChaine, false); }
        public static string RetourneMD5(string sChaine, bool bMetEnMinuscules)
        {
            try
            {
                byte[] tbTampon = System.Text.Encoding.Default.GetBytes(sChaine);

                System.Security.Cryptography.MD5CryptoServiceProvider controle;
                controle = new System.Security.Cryptography.MD5CryptoServiceProvider();
                byte[] tbSomme = controle.ComputeHash(tbTampon);
                string sResultat = string.Empty;
                foreach (byte b in tbSomme)
                {
                    sResultat += (b < 16) ? "0" + b.ToString("X", formatCulture) : b.ToString("X", formatCulture);
                }
                return (bMetEnMinuscules) ? sResultat.ToLower() : sResultat;
            }

            catch (ArgumentNullException)
            {

                throw;
            }

            catch (ObjectDisposedException)
            {

                throw;
            }
        }

        #endregion

        #region Vérifie le hashage MD5 d'une chaine

        /// <summary>
        /// Vérifie le hashage MD5 d'une chaine
        /// </summary>        
        /// <param name="sChaine">Chaine à traiter (string)</param>
        /// <param name="sChaineCryptee">Chaine cryptée en MD5</param>
        /// <param name="bMetEnMinuscules">Met la chaine de sortie en minuscules si vrai, sinon en majuscules (défaut)</param>
        /// <returns>vrai si la chaine cryptée correspond à la clé MD5, sinon faux</returns> 
        ///<exception cref="ArgumentNullException"></exception>
        ///<exception cref="ObjectDisposedException"></exception> 
        /// <example>
        /// string sResultat = (Cryptage.EstMD5Identique("papy","139f182d885595a8d88888d2170811e6",true))?"OK":"NOK";
        /// </example>
        public static bool EstMD5Identique(string sChaine, string sChaineCryptee) { return EstMD5Identique(sChaine, sChaineCryptee, false); }
        public static bool EstMD5Identique(string sChaine, string sChaineCryptee, bool bMetEnMinuscules)
        {
            try
            {
                return (RetourneMD5(sChaine, bMetEnMinuscules) == sChaineCryptee);
            }

            catch (ArgumentNullException)
            {

                throw;
            }

            catch (ObjectDisposedException)
            {

                throw;
            }
        }


        #endregion
    }
}